import { defineStore } from "pinia";
import piniaPersistConfig from "@/config/piniaPersist.js";
import config from "@/config/config";
import { convertAmountToYuan } from "@/utils/index.js"
// 获取路由地址
import pagesJson from '@/pages.json'
// 获取数据库引用
const db = uniCloud.database();
// 获取uni-id接口
const uniIdCo = uniCloud.importObject("uni-id-co", { customUI: true })
// 获取数据库的集合
const usersTable = db.collection('uni-id-users')
const usersMoney = db.collection('qc-money')
const uniApi = uniCloud.importObject('qc-user', { customUI: true })
/**
 * @name 登录或注册后的操作
 */
function init() {
	// 获取本地储存中的用户信息
	let hostUserInfo = uni.getStorageSync('uni-id-pages-userInfo') || {}
	// 获取云端的token过期时间 减去 当前的时间
	const tokenTime = uniCloud.getCurrentUserInfo().tokenExpired - Date.now()
	// 如果token有效期小于当前时间 说明过期了 把用户信息给置空
	if (tokenTime <= 0) hostUserInfo = {};
	return {
		// 用户信息
		userInfo: hostUserInfo,
		// 判断是否为登录状态，如果本地储存有用户信息，且token没有过期说明为登录状态
		hasLogin: Object.keys(hostUserInfo).length != 0 && tokenTime > 0
	}
}
export const LoginStore = defineStore({
	// id: 必须的，在所有 Store 中唯一 将来Pinia会把所有的容器挂载到根容器，每个容器的名字就是这里的ID
	id: "LoginState",
	state: () => ({
		...init()
	}),

	getters: {},

	actions: {
		// 无感更新过期状态
		updateHasLogin() {
			const { userInfo, hasLogin } = init()
			this.userInfo = userInfo
			// 如果用户信息不为0 并且token时间没有过期 说明登录了
			this.hasLogin = hasLogin
			if (!hasLogin) {
				// 清除token
				uni.removeStorageSync('uni_id_token');
				// 重置token过期时间
				uni.setStorageSync('uni_id_token_expired', 0)
			}
		},
		// data不为空，表示传递要更新的值(注意不是覆盖是合并),什么也不传时，直接查库获取更新
		async updateUserInfo(data = false) {
			if (data) {
				// 更新用户信息updateUserInfo
				const res = await usersTable.where('_id==$env.uid').update(data)
				if (res.updated) {
					uni.showToast({
						title: "更新成功",
						icon: 'none',
						duration: 3000
					});
					this.setUserInfo(data)
				} else {
					uni.showToast({
						title: "没有改变",
						icon: 'none',
						duration: 3000
					});
				}
			} else {
				try {
					const user_id = uniCloud.getCurrentUserInfo().uid
					// 获取用户信息
					let res = await usersTable.where("'_id' == $cloudEnv_uid")
						.field('wx,zfb,status,mobile,nickname,username,avatar,my_invite_code,grade_id,vip_time,vip_opendate,inviter_uid')
						.get()
					// 获取账户余额
					const money = await usersMoney.where("'user_id' == $cloudEnv_uid").field("income_balance,income_state,topup_balance,topup_state,user_id").get()
					// 如果后台把账号封禁了，立即退出登录
					if (res?.result?.data[0]?.status !== 0) {
						return this.logout()
					}
					// 获取会员权益信息
					const userVip = await db.collection('qc-vip').doc(res?.result?.data[0]?.grade_id).field("vip_type,publishNum,vip_name,creation_num,auth_audit,creation_price,one_promotion,two_promotion,group_promotion,auth_money,auth_open,open_type,auth_freeze,service_charge,discount").get()
					const user = await uniApi.getUserInfo({ user_id })
					// 设置用户信息
					this.setUserInfo({
						...res.result.data[0],
						money: convertAmountToYuan({ ...money.result.data[0], dayIncome: user.dayIncome }, ['all_topup', 'income_balance', 'topup_balance', 'all_income']),
						vipPower: userVip.result.data[0]
					})

				} catch (e) {
					this.setUserInfo({}, { cover: true })
					// 清除token
					uni.removeStorageSync('uni_id_token');
					// 重置token过期时间
					uni.setStorageSync('uni_id_token_expired', 0)
					console.error(e.message, e.errCode);
				}
			}
		},
		// 设置存储用户信息
		async setUserInfo(data, { cover } = { cover: false }) {
			// 如果cover为false说明返回了用户数据
			let userInfo = cover ? data : Object.assign(this.userInfo, data)
			// 重置上一次的用户信息
			this.userInfo = Object.assign({}, userInfo)
			// 如果用户信息不为0 并且token时间没有过期 说明登录了
			this.hasLogin = Object.keys(this.userInfo).length != 0
			// 存储用户信息
			uni.setStorageSync('uni-id-pages-userInfo', this.userInfo)
			return data
		},

		// 登出设置
		async logout() {
			// 1. 已经过期就不需要调用服务端的注销接口	2.即使调用注销接口失败，不能阻塞客户端
			if (uniCloud.getCurrentUserInfo().tokenExpired > Date.now()) {
				try {
					await uniIdCo.logout()
				} catch (e) {
					console.error(e);
				}
			}
			// 清除token
			uni.removeStorageSync('uni_id_token');
			// 重置token过期时间
			uni.setStorageSync('uni_id_token_expired', 0)
			// 跳转至登录页
			const toPage = pagesJson.uniIdRouter?.loginPage ?? 'pages/entrance/login/login'
			uni.redirectTo({ url: `/${toPage}` });
			// 退出登录的监听回调
			uni.$emit('uni-id-pages-logout')
			// 重置用户信息
			this.setUserInfo({}, { cover: true })
		},

		// 登录后需要返回的页面
		loginBack(e = {}) {
			const { uniIdRedirectUrl = '' } = e
			let delta = 0; //判断需要返回几层
			let pages = getCurrentPages();
			pages.forEach((page, index) => {
				if (pages[pages.length - index - 1].route.split('/')[3] == 'login') {
					delta++
				}
			})
			if (uniIdRedirectUrl) {
				return uni.redirectTo({
					url: uniIdRedirectUrl,
					fail: (err1) => {
						uni.switchTab({
							url: uniIdRedirectUrl,
							fail: (err2) => {
								console.log(err1, err2)
							}
						})
					}
				})
			}
			// #ifdef H5
			if (e.loginType == 'weixin') {
				// console.log('window.history', window.history);
				return window.history.go(-3)
			}
			// #endif
			if (delta) {
				const page = pagesJson.pages[0]
				return uni.reLaunch({
					url: `/${page.path}`
				})
			}
			uni.navigateBack({
				delta
			})
		},


		// 注册成功的配置
		loginSuccess(e = {}) {
			const { showToast = true, toastText = '登录成功', autoBack = true, uniIdRedirectUrl = '', passwordConfirmed } = e
			if (showToast) {
				uni.showToast({
					title: toastText,
					icon: 'none',
					duration: 3000
				});
			}
			// 更新用户信息
			this.updateUserInfo()
			// 注册成功的回调事件
			uni.$emit('uni-id-pages-login-success')

			// 判断用户是否设置密码(如果没有设置则跳转到设置密码页)
			if (config.setPasswordAfterLogin && !passwordConfirmed) {
				return uni.redirectTo({
					url: uniIdRedirectUrl ? `/pages/entrance/setPwd/setPwd?uniIdRedirectUrl=${uniIdRedirectUrl}&loginType=${e.loginType}` : `/pages/entrance/setPwd/setPwd?loginType=${e.loginType}`,
					fail: (err) => {
					}
				})
			}

			//  退出登录后在登录进入到退出前所在的页面               
			if (autoBack) {
				// this.loginBack({ uniIdRedirectUrl })
				// 跳入指定页面
				uni.switchTab({
					url: '/pages/tabbar/my/my'
				})
			}
		},
	},
	// 给GlobalState模块开启持久化
	unistorage: piniaPersistConfig("LoginState")
});